/**
  ******************************************************************************
  * @author         : KK
  * @date           : 2025/3/21
  * @description    : 求子串位序_使用串的基本操作
  ******************************************************************************
  */
#include <cstdio>

#define MAXSIZE 255

typedef struct {
    int str[MAXSIZE];
    int length;
} SString;

// 初始化串，将串置为空串
void StrInit(SString *S) {
    S->length = 0;
}

// 打印串的内容
void PrintString(SString S) {
    for (int i = 1; i < S.length; i++) {
        printf("%c", (char) S.str[i]);
    }
    printf("\n");
}

// 赋值操作，将串T赋值给chars
void StrAssign(SString *S, char *chars) {
    int i = 0;
    while (chars[i] != '\0' && i < MAXSIZE) {
        S->str[i + 1] = chars[i];
        i++;
    }
    S->length = i;
}

// 复制操作，由串S复制得到串T
void StrCopy(SString *T, SString *S) {
    for (int i = 1; i < S->length; i++) {
        T->str[i] = S->str[i];
    }
    T->length = S->length;
}

// 判断串是否为空串
bool StrEmpty(SString &S) {
    if (S.length == 0) {
        return true;
    }
    return false;
}

// 比较字符串大小
int StrCompare(SString &S, SString &T) {
    int i = 1;
    // 逐个字符比较，直到其中一个字符串结束
    while (i < S.length && i < T.length) {
        if (S.str[i] != T.str[i]) {
            return S.str[i] - T.str[i];
        }
        i++;
    }
    // 如果所有已比较字符都相同，比较字符串长度
    return S.length - T.length;
}

// 求串的长度
int StrLength(SString &S) {
    return S.length;
}

// 求主串的子串
bool SubString(SString &S, SString &Sub, int position, int length) {
    // 检查位置和长度是否合法
    if (position < 1 || position > S.length || length < 0 || position + length - 1 > S.length) {
        return false;
    }
    int i = position;
    int j = 1;
    while (i <= length + position - 1) {
        Sub.str[j] = S.str[i];
        i++;
        j++;
    }
    Sub.length = length;
    return true;
}

// 将T串拼接到S串后并返回
void Concat(SString &S, SString &T) {
    int i = S.length;
    for (int j = 1; i <= T.length; j++, i++) {
        S.str[i + 1] = T.str[j];
    }
    S.length += T.length;
}


// 找出串T在串S的位置
int Index(SString S, SString T) {
    int maxPos = StrLength(S) - StrLength(T) + 1; // 在主串能够往后移动的最大次数
    int position = 1;
    int TLength = StrLength(T);
    SString Sub; // 临时变量
    while (position <= maxPos) {
        SubString(S, Sub, position, TLength);
        if (StrCompare(Sub, T) == 0) {
            return position;
        }
        position++;
    }
    return -1; // 未找到
}

int main() {
    SString S, T;
    StrInit(&S);
    StrInit(&T);

    char s_chars[] = "Hello World";
    char t_chars[] = "World";
    StrAssign(&S, s_chars);
    StrAssign(&T, t_chars);

    int pos = Index(S, T);
    if (pos != 0) {
        printf("子串在主串中的位置是: %d\n", pos);
    } else {
        printf("未找到子串\n");
    }

    return 0;
}
